home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Amiga Plus 2000 #5
/
Amiga Plus CD - 2000 - No. 5.iso
/
Tools
/
Misc
/
InstallerNG
/
developer
/
gui
/
example
/
igui_CreateFileList.c
< prev
next >
Wrap
C/C++ Source or Header
|
1999-10-28
|
6KB
|
178 lines
#include "includes.h"
#include "installergui_data.h"
#include <string.h>
/********************************************************************
*
* DESCRIPTION
*
*/
/********************************************************************
*
* STATIC
*
*/
static BOOL walkdir_function(struct FileInfoBlock *, APTR);
static struct Node * __saveds find_node(struct List *, char *);
static APTR __asm __saveds list_construct_hook_fun(register __a0 struct Hook *, register __a1 struct FileInfoBlock *);
static void __asm __saveds list_destruct_hook_fun(register __a1 struct FileInfoBlock *);
static long __asm __saveds list_display_hook_fun(register __a1 struct FileInfoBlock *, register __a2 char **);
static long __asm __saveds list_compare_hook_fun(register __a1 struct FileInfoBlock *, register __a2 struct FileInfoBlock *);
static struct Hook list_construct_hook = { { NULL, NULL }, (void *) list_construct_hook_fun, NULL, NULL };
static struct Hook list_destruct_hook = { { NULL, NULL }, (void *) list_destruct_hook_fun, NULL, NULL };
static struct Hook list_display_hook = { { NULL, NULL }, (void *) list_display_hook_fun, NULL, NULL };
static struct Hook list_compare_hook = { { NULL, NULL }, (void *) list_compare_hook_fun, NULL, NULL };
/********************************************************************
*
* EXTERN
*
*/
/********************************************************************
*
* PUBLIC
*
*/
/********************************************************************
*
* CODE
*
*/
APTR __asm igui_CreateFileList(register __a0 APTR application,
register __a1 char *dir,
register __a2 struct FunctionEnvironment *localenv)
{
#ifdef DEBUG
DEBUG_MAKRO
#endif
{
APTR dirlist;
struct Application *app = (struct Application *) application;
// set the localenv to the hook structure, such that the "list_construct_hook" has
// access to the localenv
list_construct_hook.h_Data = localenv;
// create the list object (we cannot use a dirlist, because the list
// must have special attributes (see PATTERN/FILES/INFOS/CHOICES parameters)
// which cannot be satisfied by the simple mui dirlist
app->app_DirlistList = dirlist = ListviewObject,
MUIA_Background, MUII_ListBack,
MUIA_Frame, MUIV_Frame_InputList,
MUIA_Listview_MultiSelect, MUIV_Listview_MultiSelect_Default,
MUIA_Listview_List, ListObject,
MUIA_List_ConstructHook, &list_construct_hook,
MUIA_List_DestructHook, &list_destruct_hook,
MUIA_List_DisplayHook, &list_display_hook,
MUIA_List_CompareHook, &list_compare_hook,
End,
End;
if (dirlist)
{
// walk through the complete dir and add the entries to the list
if (sav_DirWalk((char *) localenv->fe_Source, walkdir_function, dirlist))
{
// for walking through the list we have to set the "walk-marker"
app->app_DirlistWalker = MUIV_List_NextSelected_Start;
// select all the files
DoMethod(dirlist, MUIM_List_Select, MUIV_List_Select_All, MUIV_List_Select_On, NULL);
}
else { /* should not happen */ }
}
return (dirlist);
}
}
/********************************************************************/
// give the fib to the list
static BOOL __saveds walkdir_function(struct FileInfoBlock *fib, APTR dirlist)
{
DoMethod(dirlist, MUIM_List_InsertSingle, fib, MUIV_List_Insert_Sorted);
return(TRUE);
}
static APTR __asm __saveds list_construct_hook_fun(register __a0 struct Hook *hook, register __a1 struct FileInfoBlock *fib)
{
APTR fibcpy = NULL;
BOOL accept = TRUE;
// the localenv of the function
struct FunctionEnvironment *localenv = hook->h_Data;
//
if (localenv->fe_All) { }
//
else if (!sav_IsListEmpty(&(localenv->fe_Choices)))
{
accept = (long) find_node((struct List *) &(localenv->fe_Choices), (char *) &(fib->fib_FileName));
}
//
else if (localenv->fe_Pattern)
{
accept = sav_MatchPatternNoCase((STRPTR) localenv->fe_Pattern, (char *) &(fib->fib_FileName));
if (accept == -1) { accept = 0; }
}
// if not filtered yet, we have to gon on with checking
if (localenv->fe_Fonts && accept) { accept = !sav_FontFile((char *) &(fib->fib_FileName)); }
if (localenv->fe_Infos && accept) { accept = !sav_InfoFile((char *) &(fib->fib_FileName)); }
if (localenv->fe_Files && accept) { if (fib->fib_EntryType != ST_FILE) { accept = FALSE; } }
// if we have to accept the file, clone the fib and put this
// fib to the mui list
if (accept && (fibcpy = sav_AllocVec(sizeof(struct FileInfoBlock), MEMF_ANY|MEMF_CLEAR)))
{
CopyMem(fib, fibcpy, sizeof(struct FileInfoBlock));
}
//
return(fibcpy);
}
static void __asm __saveds list_destruct_hook_fun(register __a1 struct FileInfoBlock *fib)
{
sav_FreeVec(fib);
}
static long __asm __saveds list_display_hook_fun(register __a1 struct FileInfoBlock *fib, register __a2 char **array)
{
*array = (char *) &(fib->fib_FileName);
return(0);
}
static long __asm __saveds list_compare_hook_fun(register __a1 struct FileInfoBlock *fib1, register __a2 struct FileInfoBlock *fib2)
{
return(stricmp((char *) &(fib1->fib_FileName), (char *) &(fib2->fib_FileName)));
}
static struct Node * __saveds find_node(struct List *list, char *name)
{
struct Node *node = sav_GetHead(list);
while(node)
{
if (!Stricmp(name, node -> ln_Name)) { return(node); }
node = sav_GetSucc(node);
}
//
return(NULL);
}